// sgu348
// 题意：
// 考虑一个正整数p，它是b位的，考虑它所有二进制表示下b个循环左移（或右移）
// 得道的数的集合记作w(p)，现在给你一个数n(<=10^18)，你要找到一个最小的
// 数p使得w(1), w(2), ..., w(p)的并包含{1, 2, 3, ..., n}作为子集。
//
// 题解：
// 首先答案是比第一个比n小的，所有b个循环表示中最高位是1且最小值是本身的
// 那个数。如果n本身就是b个循环表示中最高位是1且是最小值，那么n就是答案。
//
// 这个也不是很难理解，首先假设这个数为p，那么1~p这些数肯定没问题，
// 接下来考虑p+1~n，不妨随便取个数j，假设j的b个循环表示最高位为1且最小值
// 记作k，首先k肯定比p小，不然我们可以取k为p，与假设矛盾，然后既然k比p小，
// 那么j肯定属于w(k)，所以p+1~n的数也被包含了。
//
// 接下来怎么求这个p，这是一步贪心。
// 我们先将n转化为二进制表示，然后从低到高扫，扫到一个1, 就把它改成0,
// 然后比它低的位都改成1, 如果这个数满足p的性质，那么答案就是它。
//
// 为什么这个贪心成立，因为从最低位往高位走，每次把一个为1的位改成0, 比它
// 低的位改成1, 就像下面这样
//     xxxx1xxxx  ->  xxxx01111
// 这个保证了它是最大的，那么为什么比如 xxxx01101 这样没可能了，
// 当 xxxx01111 不满足条件时，它也不满足条件吗？
// 确实是，可以证明一下， xxxx01111不满足肯定是因为前面的xxxx而不满足，
// 所以xxxx01101也会因为前面而不满足，而且他本身又小，所以不纳入考虑。
//
// ml:run = $bin > output
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <bitset>
#include <vector>
#include <set>

int calc(std::vector<int> const& v)
{
    int ret = 0, pow2 = 1;
    for (size_t i = 0; i < v.size(); i++, pow2 *= 2)
        ret += pow2 * v[i];
    return ret;
}

std::set<size_t> calc(int x)
{
    std::vector<int> v;
    std::set<size_t> ret;
    int len = 0;
    for (; x; x /= 2) {
        v.push_back(x & 1);
        len++;
    }
    for (int i = 0; i < len; i++) {
        std::rotate(v.begin(), v.begin() + 1, v.begin() + len);
        ret.insert(calc(v));
    }
    return ret;
}

int cycle_min(int x)
{
    std::vector<int> v;
    int ret = x;
    int len = 0;
    for (; x; x /= 2) {
        v.push_back(x & 1);
        len++;
    }
    for (int i = 0; i < len; i++) {
        std::rotate(v.begin(), v.begin() + 1, v.begin() + len);
        if (v[len - 1]) ret = std::min(ret, calc(v));
    }
    return ret;
}

int main()
{
    for (size_t i = 1; i <= 1000; i++) {
        std::set<size_t> now;
        for (int j = 1; ; j++) {
            auto s = calc(j);
            for (auto t : s) if (t <= i) now.insert(t);
            if (now.size() == i) {
                int t = cycle_min(i);
                std::cout << std::setw(4) << i << ":  " << std::setw(4) << j << "  " << std::bitset<11>(i) << "   " << std::bitset<11>(j) << "  " << std::setw(4) << t << "   " << std::bitset<11>(t) << "\n";
                break;
            }
        }
    }
}

